home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / editor / proged10.lha / InstallProgED / sources / DevManual
Text File  |  1995-09-02  |  34KB  |  1,401 lines

  1.  
  2.               -----------------------------------------------
  3.  
  4.                  ProgED V1.0 by Giovanni Lambiase (C) 1995
  5.  
  6.                          Note per i programmatori
  7.  
  8.               -----------------------------------------------
  9.  
  10.  
  11. -------------------------
  12.  1. Strutture principali
  13. -------------------------
  14.  
  15.     In questo paragrafo descriveremo tutte le strutture utili per un
  16. utente che indenta scrivere un cliente API. Le strutture PEDWindow e Prefs
  17. descrivono, rispettivamente, le finestre aperte dal ProgED e le preferenze
  18. globali. Seguono altre strutture più piccole ma non meno importanti, come
  19. la struttura che definisce le linee del testo o i programmi interni
  20. (creati dal pannello di programmazione del ProgED). Il commento ad ogni
  21. campo inizia con i caratteri "^--" ).
  22.  
  23.  
  24.  
  25.  
  26.     struct PEDWindow
  27.     {
  28.     struct Window    *Window;
  29.  
  30.         ^-- Puntatore alla finestra intuition. Se la finestra è chiusa
  31.             (vedi comando interno FREEZE) vale NULL.
  32.  
  33.     struct Gadget    *GadgetScrollX,
  34.             *GadgetScrollY,
  35.             *GadgetUpArrow,
  36.             *GadgetDownArrow,
  37.             *GadgetLeftArrow,
  38.             *GadgetRightArrow;
  39.  
  40.     ^-- Puntatori ai gadget di scorrimento e alle relative frecce.
  41.  
  42.     struct Image    *ImageUpArrow,
  43.             *ImageDownArrow,
  44.             *ImageLeftArrow,
  45.             *ImageRightArrow;
  46.  
  47.     ^-- Immagini delle quattro frecce attaccate ai gadget di scroll.
  48.  
  49.     int         OldSx,
  50.              OldSy,
  51.  
  52.     ^-- Ascissa (colonna) e ordinata (linea) del primo carattere in alto
  53.             a sinistra nella finestra PRECEDENTI quelle attuali. Questi valori
  54.             non considerano i fold precedenti che vengono considerati come una
  55.             singola linea.
  56.  
  57.              Sx,
  58.              Sy;
  59.  
  60.     ^-- Ascissa (colonna) e ordinata (linea) del primo carattere in alto
  61.             a sinistra nella finestra ATTUALI. Questi valori non considerano
  62.             i fold precedenti che vengono considerati come una singola linea.
  63.  
  64.     struct Line    *FirstLine,
  65.             *LastLine;
  66.  
  67.     ^-- Puntatore alla prima ed alla ultima linea del testo.
  68.  
  69.     LONG         MaxCol,
  70.  
  71.     ^-- Copia di Prefs.MaxCol (Num. max di colonne nel testo).
  72.  
  73.              NumCol,
  74.  
  75.     ^-- Num. di colonne nella finestra (larghezza in caratteri).
  76.  
  77.              MaxLine,
  78.  
  79.     ^-- Num. di linee nel testo (non tiene conto dei fold).
  80.  
  81.              NumLine;
  82.  
  83.     ^-- Num. di linee nella finestra (altezza in linee).
  84.  
  85.     ULONG         Size;
  86.  
  87.     ^-- Dimensione in byte del testo in memoria.
  88.  
  89.     WORD         Left,
  90.              Top,
  91.              Width,
  92.              Height;
  93.  
  94.     ^-- Variabili temporanee. Mantengono le dimensioni e la posizione
  95.             della finestra mentre è chiusa.
  96.  
  97.     WORD         ZoomInfo[4];
  98.  
  99.     ^-- Array relativo al gadget Zoom di intuition.
  100.  
  101.     char         FileName[200];
  102.  
  103.     ^-- Nome del file (completo) caricato in memoria.
  104.  
  105.     char         Title[200];
  106.  
  107.     ^-- In questa zona ProgED costruisce il titolo della finestra.
  108.  
  109.     LONG         CursorCol;
  110.     LONG         CursorLine;
  111.  
  112.     ^-- Posizione del cursore nel testo (colonna/linea). Non tiene
  113.             conto dei fold.
  114.  
  115.     LONG         LastCursorCol;
  116.  
  117.     ^-- Ultima colonna in cui abbiamo scritto qualcosa.
  118.  
  119.     struct Line    *Line;
  120.  
  121.     ^-- Puntatore alla linea su cui si trova il cursore.
  122.  
  123.     UWORD         RealNumCol;
  124.  
  125.     ^-- Num colonne reali (numero di bytes,un TAB è pari ad 1).
  126.  
  127.     UWORD         LogicNumCol;
  128.  
  129.     ^-- Num colonne logiche (tiene conto degli spazi relativi ai TAB).
  130.  
  131.     UWORD         FWidth,
  132.              FHeight,
  133.  
  134.     ^-- Larghezza e altezza (in pixel) del font utilizzato.
  135.  
  136.              FBase,
  137.  
  138.     ^-- Baseline del font utilizzato.
  139.  
  140.              WOffsetX,
  141.              WOffsetY;
  142.  
  143.     ^-- Offset X ed Y della finestra (dovuto ai bordi sup. e sinistro).
  144.  
  145.     struct RastPort *RP;
  146.  
  147.     ^-- Rastport della finestra (Window->RPort).
  148.  
  149.     UBYTE         Ins;
  150.  
  151.     ^-- TRUE=modo inserimento,FALSE=modo overwrite.
  152.  
  153.     UBYTE         MLine,
  154.  
  155.     ^-- TRUE=blocco con opzione LINE, FALSE=altrimenti.
  156.  
  157.              Block;
  158.  
  159.     ^-- Tipo blocco: NO_SEL,BLOCK_SEL,COLBLOCK_SEL (vedi file "Ped.h").
  160.  
  161.     LONG         BlockLine,
  162.              BlockCol;
  163.  
  164.     ^-- Inizio blocco marcato (linea e colonna).
  165.  
  166.     ULONG         Changes;
  167.  
  168.     ^-- Cambi dall'ultimo salvataggio.
  169.  
  170.     struct Event     *Events;
  171.  
  172.     ^-- Puntatore ad un array di strutture Events. Ogni struttura
  173.             mantiene un evento per la coda di UNDO/REDO. Il numero di
  174.             strutture è dato nel successivo campo UndoLevels.
  175.  
  176.     LONG         LastEvent;
  177.  
  178.     ^-- Ultimo evento nella coda.
  179.  
  180.     ULONG         NumEvent,
  181.  
  182.     ^-- Numero di eventi nella coda.
  183.  
  184.              NumRedo,
  185.  
  186.     ^-- Numero di REDO possibili.
  187.  
  188.              UndoLevels;
  189.  
  190.     ^-- Lunghezza della coda.
  191.  
  192.     char        *CuttedLine;
  193.  
  194.     ^-- Clipboard linea (vedi comando LINE CUT).
  195.  
  196.     struct Marker    Marker[MAXMARKER];
  197.  
  198.     ^-- Vettori di marker. Ogni marker detiene una posizione nel testo.
  199.  
  200.     struct Folder    *Folder;
  201.  
  202.     ^-- Puntatore ad una lista di folder. Ogni struttura mantiene le
  203.             informazioni relative ad un fold.
  204.  
  205.     int         LinesFolded;
  206.  
  207.     ^-- Numero di linee chiuse nei vari fold.
  208.  
  209.     int         NumFolds;
  210.  
  211.     ^-- Numero totale di fold.
  212.  
  213.     UBYTE         Frozen;
  214.  
  215.     ^-- TRUE=finestra chiusa, FALSE=aperta.
  216.  
  217.     ULONG         Locked;
  218.  
  219.     ^-- Se >0 la finestra è bloccata dagli handler.
  220.  
  221.     ULONG         AutoSave;
  222.  
  223.     ^-- Contatore autosave (in secondi). Decresce fino a 0.
  224.  
  225.     struct Line    *OldLine;
  226.     UBYTE        *LineBuffer,
  227.             *Pun,
  228.              InsLine,
  229.              Warn;
  230.  
  231.     ^-- Dati utili SOLO durante il load dal PED_DISK. Non manipolare.
  232.  
  233.     UBYTE             OldKeys[MAXTEMPLATE];
  234.     UBYTE             PunOldKeys;
  235.  
  236.     ^-- Dati utili per i template (ricordano gli ultimi tasti battuti).
  237.  
  238.     struct DateStamp    DateStamp;
  239.  
  240.     ^-- Data ultima modifica (utile per gli handler).
  241.  
  242.     struct PEDWindow    *NextWindow;
  243.  
  244.     ^-- LINK alla prossima finestra del ProgED.
  245.  
  246.     ULONG             UserData[16];
  247.  
  248.     ^-- Dati utente. Se hai bisogno di memorizzare dati per ogni
  249.             finestra utilizza questi campi.
  250.     }
  251.  
  252.  
  253.  
  254.  
  255.     struct Prefs
  256.     {
  257.     ULONG        ScreenMode;
  258.     UWORD        ScreenWidth;
  259.     UWORD        ScreenHeight;
  260.     UWORD        ScreenOverscanType;
  261.     UBYTE        ScreenDepth;
  262.     UBYTE        ScreenAutoScroll;
  263.  
  264.     ^-- Caratteristiche dello schermo del ProgED: DisplayID,larghezza,
  265.             altezza,tipo overscan,profondità,flag autoscroll.
  266.  
  267.     UWORD        ScreenColors[MAXCOLOR];
  268.  
  269.     ^-- Primi MAXCOLOR colori dello schermo. Tali colori vengono
  270.             memorizzati e salvati da ProgED.
  271.  
  272.     char        ScreenFontName[MAXFONTNAM+1];
  273.     UWORD        ScreenFontSize;
  274.  
  275.     ^-- Nome e dimensione del font per lo schermo.
  276.  
  277.     char        MenuFontName[MAXFONTNAM+1];
  278.     UWORD        MenuFontSize;
  279.  
  280.     ^-- Nome e dimensione del font per i menù.
  281.  
  282.     char        TextFontName[MAXFONTNAM+1];
  283.     UWORD        TextFontSize;
  284.  
  285.     ^-- Nome e dimensione del font per i testi.
  286.  
  287.     char        GadgetFontName[MAXFONTNAM+1];
  288.     UWORD        GadgetFontSize;
  289.  
  290.     ^-- Nome e dimensione del font per i gadget. ATTENZIONE solo
  291.             font di dimensione 8 !!!!!!!!!!!!!!!
  292.  
  293.     UWORD        MaxCol;
  294.  
  295.     ^-- Numero massimo di colonne per i testi. Ogni finestra, all'apertura,
  296.             copia nel suo omonimo campo questo valore.
  297.  
  298.     UBYTE        AltStep;
  299.  
  300.     ^-- Salto righe quando si utilizza il comando UP STEP (o DOWN STEP).
  301.  
  302.     UBYTE        Tab;
  303.  
  304.     ^-- Dimensione TAB in caratteri.
  305.  
  306.     UBYTE        LeftBorder;
  307.     UBYTE        RightBorder;
  308.     UBYTE        TopBorder;
  309.     UBYTE        BottomBorder;
  310.  
  311.     ^-- Bordi oltre il quale il cursore provoca uno scroll.
  312.  
  313.     UBYTE        UseKeyWordColors;
  314.  
  315.     ^-- TRUE=attiva l'uso dei colori per le parole chiavi,FALSE=disabilita.
  316.  
  317.     UBYTE        KeyAlpha[256];
  318.  
  319.     ^-- NON MANIPOLARE!!!!!!!!!!!!!!!!!!!!!! Grazie.
  320.  
  321.     char        **KeyWord;
  322.  
  323.     ^-- Puntatore al vettore di (char *) contenente le parole.
  324.  
  325.     int        NumKeyWord;
  326.  
  327.     ^-- Numero di parole nel vettore.
  328.  
  329.     char        GestColorOff,
  330.             GestColorOn;
  331.  
  332.     ^-- Caratteri di disattivazione ed attivazione della gestione.
  333.  
  334.     UBYTE        UseCommentColors;
  335.  
  336.     ^-- TRUE=Attiva l'uso dei colori per i commenti,FALSE=disabilita.
  337.  
  338.     UWORD        CheckColorLines;
  339.  
  340.     ^-- Max num. di linee di un commento (0=senza limite).
  341.  
  342.     UBYTE        Comment1Pen,
  343.  
  344.     ^-- Penna da utilizzare per i commenti tra più linee.
  345.  
  346.             Comment2Pen;
  347.  
  348.     ^-- Penna da utilizzare per i commenti fino a fine linea.
  349.  
  350.     char        Comment1On[MAXCOMMENT+1],
  351.             Comment1Off[MAXCOMMENT+1],
  352.  
  353.     ^-- Stringhe iniziali e finali dei commenti su più linee.
  354.  
  355.             Comment2On[MAXCOMMENT+1];
  356.  
  357.     ^-- Stringa iniziale dei commenti fino a fine linea.
  358.  
  359.     UBYTE        BackPen;
  360.  
  361.     ^-- Penna sfondo schermo.
  362.  
  363.     UBYTE        PaperPen;
  364.  
  365.     ^-- Penna carta (sfondo finestre).
  366.  
  367.     UBYTE        DefTextPen;
  368.  
  369.     ^-- Penna testo.
  370.  
  371.     UBYTE        PaperBlockPen;
  372.  
  373.     ^-- Penna blocchi marcati.
  374.  
  375.     UWORD        ScreenPens[13];
  376.  
  377.     ^-- Penne intuition dello schermo del ProgED.
  378.  
  379.     UBYTE        Clipboard;
  380.  
  381.     ^-- Clipboard standard.
  382.  
  383.     UBYTE        EraseRight;
  384.  
  385.     ^-- TRUE=attiva cancellazione spazi e TAB a fine linea.
  386.  
  387.     UBYTE        ShowCursorPos;
  388.  
  389.     ^-- TRUE=Mostra la posizione (linea e colonna) del cursore nella
  390.             barra del titolo della finestra.
  391.  
  392.     UBYTE        ShowPathName;
  393.  
  394.     ^-- TRUE=Mostra il path completo del file,FALSE=solo il nome.
  395.  
  396.     UBYTE        AutoArrangeVer;
  397.  
  398.     ^-- TRUE=Arrangia verticalmente le finestre. Questo flag è
  399.             mutuamente esclusivo col successivo.
  400.  
  401.     UBYTE        AutoArrangeHor;
  402.  
  403.     ^-- TRUE=Arrangia orizzontalmente le finestre. Questo flag è
  404.             mutuamente esclusivo col successivo.
  405.  
  406.     UBYTE        Favourite;
  407.  
  408.     ^-- TRUE=Favorisci la finestra attiva dandole mezzo schermo.
  409.  
  410.     UBYTE        UseSetDefPubScr;
  411.  
  412.     ^-- TRUE=Setta lo schermo del ProgED come schermo pubblico.
  413.  
  414.     UBYTE        UseClock;
  415.  
  416.     ^-- TRUE=Attiva l'orologio sullo schermo del ProgED.
  417.  
  418.     UBYTE        Backup;
  419.  
  420.     ^-- TRUE=Crea un backup ad ogni salvataggio.
  421.  
  422.     UBYTE        Save;
  423.  
  424.     ^-- TRUE=Salvataggio sicuro,FALSE=normale.
  425.  
  426.     UBYTE        SaveRefs;
  427.  
  428.     ^-- TRUE=Salva,insieme al file, i riferimenti contenuti nel file
  429.             stesso.
  430.  
  431.     UBYTE        UnfoldOnGotoMarker;
  432.     UBYTE        UnfoldOnGotoLine;
  433.     UBYTE        UnfoldOnGotoByte;
  434.     UBYTE        UnfoldOnGotoScan;
  435.  
  436.     ^-- TRUE=Effettua un unfold quando il ProgED salta ad una linea dopo:
  437.             1) un salto ad un marker, 2) un salto ad una linea, 3) un salto
  438.             ad un byte, 4) un salto ad un riferimento
  439.  
  440.     UBYTE        BlankBorders;
  441.  
  442.     ^-- TRUE=Elimina i bordi degli schermi (rendili neri).
  443.  
  444.     UBYTE        AutoFold;
  445.  
  446.     ^-- TRUE=Auto-fold al caricamento.
  447.  
  448.     char        SearchFoldFileName[MAXFOLDFUNCNAME+1];
  449.  
  450.     ^-- Nome della funzione di ricerca dei fold.
  451.  
  452.     LONG        DefBits;
  453.  
  454.     ^-- Bits da dare ai file salvati (bisogna effettuare uno XOR con
  455.             0x000F prima di effettuare l'operazione).
  456.  
  457.     char        DefComment[MAXCOMMENT2+1];
  458.  
  459.     ^-- Commento da dare ai file salvati.
  460.  
  461.     UBYTE        CreateIcons;
  462.  
  463.     ^-- TRUE=Crea icone per i file salvati.
  464.  
  465.     UBYTE        UseKeyWordInd;
  466.  
  467.     ^-- TRUE=Abilita l'indentazione automatica.
  468.  
  469.     char        **KeyWordInd;
  470.  
  471.     ^-- Puntatore ad un vettore di parole. Ogni parola termina con uno
  472.             dei caratteri IND_xxx che specifica il tipo di indentazione.
  473.  
  474.     int        NumKeyWordInd;
  475.  
  476.     ^-- Numero di parole nel vettore.
  477.  
  478.     UWORD        IndJump;
  479.  
  480.     ^-- Colonne per livello d'indentazione.
  481.  
  482.     UBYTE        SeparateItems;
  483.  
  484.     ^-- TRUE=Separa i menù con una barra.
  485.  
  486.     struct MyMenu    *Menu;
  487.  
  488.     ^-- Puntatore ad una lista che definisce i menù.
  489.  
  490.     char        HelpFile[MAXFILENAME+1];
  491.  
  492.     ^-- Nome file della guida per i menù.
  493.  
  494.     struct MyKey    *Key;
  495.  
  496.     ^-- Puntatore ad una lista che definisce i tasti.
  497.  
  498.     UBYTE        UseAppIcon;
  499.  
  500.     ^-- TRUE=Mostra la AppIcon quando sei iconificato.
  501.  
  502.     UBYTE        UseMenuItem;
  503.  
  504.     ^-- TRUE=Appendi un item al menù "Strumenti" del WB quando sei
  505.             iconificato.
  506.  
  507.     UBYTE        UseAutoSave;
  508.  
  509.     ^-- TRUE=Attiva autosalvataggio.
  510.  
  511.     UWORD        MinAutoSave;
  512.  
  513.     ^-- Numero di minuti tra gli autosave.
  514.  
  515.     UBYTE        AutoReLoad;
  516.  
  517.     ^-- TRUE=Ricarica, alla partenza, tutti i testi che erano in
  518.             memoria nella sessione precedente.
  519.  
  520.     UBYTE        MouseBlanker;
  521.  
  522.     ^-- TRUE=Attiva il mouseblanker.
  523.  
  524.     UBYTE        FastLoad;
  525.  
  526.     ^-- TRUE=Attiva il caricamento veloce,FALSE=normale.
  527.  
  528.     char        **APIClients;
  529.  
  530.     ^-- Puntatore ad un vettore di (char *). Ogni stringa è il nome
  531.             (su disco) di un cliente API.
  532.  
  533.     int        NumAPIClients;
  534.  
  535.     ^-- Numero di stringhe nel vettore precedente (numero clienti API).
  536.  
  537.     char        StartUpMacro[MAXSTARTUPMACRO];
  538.  
  539.     ^-- Macro REXX iniziale.
  540.  
  541.     char        PreIconifyMacro[MAXSTARTUPMACRO];
  542.  
  543.     ^-- Macro REXX pre-iconificazione.
  544.  
  545.     char        PostIconifyMacro[MAXSTARTUPMACRO];
  546.  
  547.     ^-- Macro REXX post-iconificazione.
  548.  
  549.     struct MyScan    *Scan;
  550.  
  551.     ^-- Puntatore ad una lista contenente gli scanner attualmente
  552.             caricati.
  553.  
  554.     struct MyTemplate    *Template;
  555.  
  556.     ^-- Puntatore ad una lista contenente i template.
  557.  
  558.     UBYTE        UseTemplate;
  559.  
  560.     ^-- TRUE=Attiva gestione dei template.
  561.  
  562.     UBYTE        UseRightGadget;
  563.  
  564.     ^-- TRUE=Attiva il gadget di scrolling destro.
  565.  
  566.     UBYTE        UseBottomGadget;
  567.  
  568.     ^-- TRUE=Attiva il gadget di scrolling inferiore.
  569.  
  570.     LONG        LeftExtraSpace,
  571.             RightExtraSpace,
  572.             TopExtraSpace,
  573.             BottomExtraSpace;
  574.  
  575.     ^-- Spazi liberi (in pixel) da lasciare in alto,basso,destra e
  576.             sinistra quando le finestre vengono riaggiustate.
  577.  
  578.     char        **DictWord;
  579.  
  580.     ^-- Puntatore ad un vettore di (char *).Ogni stringa è una delle
  581.             frasi presenti nel dizionario.
  582.  
  583.     int        NumDictWord;
  584.  
  585.     ^-- Numero di parole nel dizionario.
  586.  
  587.     UBYTE        UseAutoCase;
  588.  
  589.     ^-- TRUE=Attiva autocase (aggiusta maius./minus. delle parole
  590.             presenti nel dizionario).
  591.  
  592.     UBYTE        CheckPar;
  593.  
  594.     ^-- TRUE=Attiva controllo delle parentesi '(' ')' quando il
  595.             cursore lascia la linea.
  596.  
  597.     UBYTE        FastMode;
  598.  
  599.     ^-- TRUE=Attiva modo veloce,FALSE=modo normale.
  600.  
  601.     char        **Ref;
  602.  
  603.     ^-- Puntatore ad un vettore di (char *). Ogni stringa contiene un
  604.             pattern o una directory in cui cercare i riferimenti durante
  605.             la creazione della mappa.
  606.  
  607.     int        NumRef;
  608.  
  609.     ^-- Numero di stringhe nel vettore precedente.
  610.  
  611.     UBYTE        RAMReference;
  612.  
  613.     ^-- TRUE=Mantieni la mappa dei riferimenti in RAM.
  614.  
  615.     UBYTE        ReferenceCase;
  616.  
  617.     ^-- TRUE=Ricerca dei riferimenti case-sensitive,FALSE=non case-sen.
  618.  
  619.     char        ReferenceFile[MAXREFNAME+1];
  620.  
  621.     ^-- Nome del file contenente la mappa dei riferimenti.
  622.  
  623.     char        **HuntPath;
  624.  
  625.     ^-- Puntatore ad un vettore di stringhe. Ogni stringa rappresenta
  626.             una directory in cui ricercare i file quando l'utente attiva
  627.             l'apposito comando.
  628.  
  629.     int        NumHuntPath;
  630.  
  631.     ^-- Numero di stringhe presenti nel vettore precedente.
  632.  
  633.     UBYTE        UseRTSysReq;
  634.     UBYTE        UseRTFileReq;
  635.     UBYTE        UseRTFontReq;
  636.     UBYTE        UseRTScreenReq;
  637.  
  638.     ^-- TRUE=Usa, rispettivamente, le richieste, i file-requester,
  639.             i font-requester, e i screenmode-requester della ReqTools.library.
  640.             Ponendo a FALSE uno dei flag ProgED utilizza la Asl.library.
  641.  
  642.     char        **ProjectFiles;
  643.  
  644.     ^-- Puntatore ad un vettore di stringhe. Ogni stringa è il nome
  645.             di uno dei file nel progetto.
  646.  
  647.     int        NumProjectFiles;
  648.  
  649.     ^-- Numero di file nel progetto (numero di stringhe nel vettore
  650.             precedente).
  651.  
  652.     UWORD        Left,
  653.             Right;
  654.  
  655.     ^-- Margini sinistro e destro per le operazioni di raggruppamento
  656.             dei blocchi.
  657.  
  658.     char        XpkLib[5];
  659.  
  660.     ^-- Nome libreria XPK da utilizzare per i salvataggi con la
  661.             XpkMaster.library.
  662.  
  663.     UBYTE        XpkMode;
  664.  
  665.     ^-- Modo XPK da utilizzare per i salvataggi con la XpkMaster.library.
  666.  
  667.     int        XpkPos;
  668.  
  669.     ^-- NON MANIPOLARE!!!!!!!!!! Grazie.
  670.  
  671.     char        XpkPassWord[52];
  672.  
  673.     ^-- Password per le librerie XPK che la richiedono.
  674.  
  675.         ULONG        UndoLevels;
  676.  
  677.     ^-- Numero di livelli di UNDO. Quando ProgED apre una nuova finestra
  678.             copia questo valore nel campo UndoLevels della finestra e crea
  679.             la coda di UNDO della lunghezza data.
  680.     }
  681.  
  682.  
  683.  
  684.  
  685.     struct Line
  686.     {
  687.     char        *Buffer;
  688.  
  689.     ^-- Testo della linea (termina con zero)
  690.  
  691.     struct Line    *PrevLine,
  692.             *NextLine;
  693.  
  694.     ^-- Puntatori alla linea precedente e successiva del testo
  695.  
  696.     struct Folder    *Folder;
  697.  
  698.     ^-- Se questa linea è chiusa in un fold questo puntatore punta
  699.             alla relativa struttura Folder (che si trova nella apposita
  700.             lista presente nella finestra).
  701.     }
  702.  
  703.  
  704.  
  705.  
  706.     struct MyTemplate
  707.     {
  708.     char             Template[MAXTEMPLATE+1];
  709.  
  710.     ^-- Stringa che attiva questo template.
  711.  
  712.     struct MyProgram    *Prg;
  713.  
  714.     ^-- Programma interno da eseguire all'attivazione.
  715.  
  716.     struct MyTemplate    *NextTemplate;
  717.  
  718.     ^-- Puntatore alla prossima struttura della lista.
  719.     }
  720.  
  721.  
  722.  
  723.     struct MyScan
  724.     {
  725.     BPTR         SegList;
  726.  
  727.     ^-- Puntatore BPTR alla seglist della funzione caricata.
  728.  
  729.     ULONG        (* ASM ScanFunction)(RG(a0) char *,RG(a1) char *);
  730.  
  731.     ^-- Puntatore alla funzione assembler contenuta nella seglist
  732.             precedente (è pari all'indirizzo precedente più 4 bytes).
  733.  
  734.     char         ScanExtension[MAXEXTSCAN+1],
  735.  
  736.     ^-- Pattern AmigaDOS che individua i file su cui deve operare lo
  737.             scanner.
  738.  
  739.              Name[MAXSCANNAME+1];
  740.  
  741.     ^-- Nome (su disco) della funzione.
  742.  
  743.     struct MyScan    *NextScan;
  744.  
  745.     ^-- Puntatore alla prossima struttura della lista.
  746.     }
  747.  
  748.  
  749.  
  750.  
  751.     struct MyProgram
  752.     {
  753.     char            *String,
  754.  
  755.     ^-- Puntatore alla stringa del comando.
  756.  
  757.                 *Dir,
  758.  
  759.     ^-- Eventuale directory corrente (solo per TYPE_SHELL/TYPE_AREXX).
  760.  
  761.                 *Output;
  762.  
  763.     ^-- Eventuale file d'uscita (solo per TYPE_SHELL/TYPE_AREXX).
  764.  
  765.     UBYTE             Type;
  766.  
  767.     ^-- Tipo del comando (vedi costanti TYPE_xxxxx).
  768.  
  769.     UBYTE             Async;
  770.  
  771.     ^-- TRUE=comando asincrono,FALSE=sincrono. Vale solo per i
  772.             comandi di tipo TYPE_SHELL. è automaticamente TRUE per
  773.             i comandi TYPE_AREXX.
  774.  
  775.     struct MyProgram    *NextProgram;
  776.  
  777.     ^-- Puntatore al prossimo comando del programma interno.
  778.     }
  779.  
  780.  
  781.  
  782.  
  783.     struct MyMenu
  784.     {
  785.     char             Name[MAXMENUNAME+1];
  786.  
  787.     ^-- Nome di questo menù.
  788.  
  789.     struct MyItem        *Items;
  790.  
  791.     ^-- Puntatore alla lista di item relativi a questo menù.
  792.  
  793.     struct MyMenu        *NextMenu;
  794.  
  795.     ^-- Puntatore al prossimo menù della lista.
  796.     }
  797.  
  798.     struct MyItem
  799.     {
  800.     char             Name[MAXMENUNAME+1];
  801.  
  802.     ^-- Nome di questo item.
  803.  
  804.     char             Key[MAXMENUNAME+1];
  805.  
  806.     ^-- Tasto (o stringa) di attivazione di questo item.
  807.  
  808.     struct MySub        *Subs;
  809.  
  810.     ^-- Puntatore alla lista di subitem relativi a questo menù.
  811.  
  812.     struct MyProgram    *Prg;
  813.  
  814.     ^-- Puntatore al programma interno da eseguire all'attivazione
  815.             di questo item.
  816.  
  817.     UBYTE             CheckType;    /* NB: DEVE RIMANERE DOPO Prg */
  818.  
  819.     ^-- Tipo di checkmark da assegnare a questo item. Vedi costanti
  820.             CHECK_xxxx.
  821.  
  822.     struct MyItem        *NextItem;
  823.  
  824.     ^-- Puntatore al prossimo item.
  825.     }
  826.  
  827.     struct MySub
  828.     {
  829.     char             Name[MAXMENUNAME+1];
  830.  
  831.     ^-- Nome di questo subitem.
  832.  
  833.     char             Key[MAXMENUNAME+1];
  834.  
  835.     ^-- Tasto (o stringa) d'attivazione di questo subitem.
  836.  
  837.     struct MyProgram    *Prg;
  838.  
  839.     ^-- Programma interno da eseguire all'attivazione del subitem.
  840.  
  841.     UBYTE             CheckType;    /* NB: DEVE RIMANERE DOPO Prg */
  842.  
  843.     ^-- Tipo di checkmark da assegnare a questo item. Vedi costanti
  844.             CHECK_xxxx.
  845.  
  846.     struct MySub        *NextSub;
  847.  
  848.     ^-- Puntatore al prossimo subitem.
  849.     }
  850.  
  851.  
  852.  
  853.  
  854.     struct MyKey
  855.     {
  856.     ULONG             Qual,
  857.                  Code;
  858.  
  859.     ^-- Identificano il tasto a cui rispondere (corrispondono ai campi
  860.             Code e Qualifier di un messaggio intuition).
  861.  
  862.     struct MyProgram    *Prg;
  863.  
  864.     ^-- Programma interno da eseguire all'attivazione del tasto.
  865.  
  866.     struct MyKey        *NextKey;
  867.  
  868.     ^-- Prossimo tasto nella lista.
  869.     }
  870.  
  871.     struct Event
  872.     {
  873.     UBYTE         Type;
  874.     UBYTE         Arg1;
  875.     char        *Arg2;
  876.     ULONG         Arg3,
  877.              Arg4,
  878.              Arg5,
  879.              Arg6,
  880.              Arg7;
  881.     LONG         Col,
  882.              Line;
  883.     }
  884.  
  885.     ^-- Questa struttura è volutamente lasciata senza commento.
  886.  
  887.  
  888.  
  889.  
  890.     struct Folder
  891.     {
  892.     char         Name[MAXFOLDNAME+1];
  893.  
  894.     ^-- Nome assegnato dalla funzione di ricerca a questo fold (viene
  895.             mostrato sulla linea che rappresenta il fold stesso).
  896.  
  897.     long         Num;
  898.  
  899.     ^-- Numero di linee di cui è composto il fold.
  900.  
  901.     struct Line    *Line;
  902.  
  903.     ^-- Linea alla quale si trovava il cursore al momento della
  904.             chiusura.
  905.  
  906.     long         Col;
  907.  
  908.     ^-- Colonna alla quale si trovava il cursore al momento della
  909.  
  910.     struct Line    *Start,
  911.             *End;
  912.  
  913.     ^-- Linea iniziale e finale del fold.
  914.  
  915.     struct Folder    *NextFolder;
  916.  
  917.     ^-- Puntatore al prossimo fold della lista.
  918.     }
  919.  
  920.  
  921.  
  922.  
  923.     struct Marker
  924.     {
  925.     struct Line    *Line;
  926.  
  927.     ^-- Puntatore alla linea relativa alla posizione memorizzata. Se la
  928.             linea viene cancellata ProgED porta, automaticamente, questo
  929.             valore a NULL. In questo caso un eventuale salto porta il
  930.             cursore alla prima linea del testo.
  931.  
  932.     long         Col;
  933.  
  934.     ^-- Colonna relativa alla posizione memorizzata.
  935.     }
  936.  
  937.  
  938.  
  939.  
  940. ------------
  941.  2. Scanner
  942. ------------
  943.  
  944.     Uno scanner deve essere scritto tramite una funzione assembler o una
  945. funzione C che prende gli argomenti nei registri. Il codice risultante
  946. deve essere linkato SENZA alcun modulo di startup, in modo tale che la
  947. prima locazione eseguibile sia l'inizio della funzione scritta. La
  948. funzione di ricerca riceve due argomenti nei seguenti registri:
  949.  
  950.     A0: Indirizzo della linea su cui effettuare la ricerca. Punta ad una
  951.         stringa terminata con 0.
  952.  
  953.     A1: Indirizzo del buffer che conterrà il riferimento, se trovato.
  954.  
  955.     La funzione deve ritornare nel registro D0 la lunghezza della stringa
  956. creata nel buffer puntato da A1. Nel caso la funzione non abbia trovato
  957. nulla deve ritornare 0.
  958.  
  959.     NOTA: è necessario salvare tutti i registri all'ingresso della
  960.           funzione e ripristarli all'uscita.
  961.  
  962.  
  963.  
  964. -----------
  965.  3. Folder
  966. -----------
  967.  
  968.     Una funzione di ricerca dei fold deve essere scritta tramite una funzione
  969. assembler o una funzione C che prende gli argomenti nei registri. Il codice
  970. risultante deve essere linkato SENZA alcun modulo di startup, in modo tale
  971. che la prima locazione eseguibile sia l'inizio della funzione scritta. La
  972. funzione di ricerca riceve due argomenti nei seguenti registri:
  973.  
  974.     A0: è l'indirizzo della struttura PEDWindow relativa al testo su
  975.         cui effettuare la ricerca.
  976.  
  977.     D0: Contiene il numero della colonna su cui è posizionato il cursore.
  978.         (0=prima colonna).
  979.  
  980.     D1: Contiene il numero della linea su cui è posizionato il cursore.
  981.         Tale numero è assoluto. Ciò significa che non tiene conto dei
  982.         fold eventualmente presenti nel testo. (0=prima linea).
  983.  
  984.     A1: Contiene l'indirizzo di una long-word. In tale long-word la funzione
  985.         deve scrivere il numero della linea iniziale del fold, se trovato.
  986.         Anche in questo caso la funzione non deve considerare eventuali
  987.         fold già presenti nel testo. (0=prima linea).
  988.  
  989.     A2: Contiene l'indirizzo di una long-word. In tale long-word la funzione
  990.         deve scrivere il numero della linea finale del fold, se trovato.
  991.         Anche in questo caso la funzione non deve considerare eventuali
  992.         fold già presenti nel testo. (0=prima linea).
  993.  
  994.     A3: Punta ad un buffer in cui la funzione deve scrivere la stringa
  995.         che ProgED scriverà a fianco dell'indicatore ">FOLD". Generalmente
  996.         il nome della funzione C, ecc.
  997.  
  998.     La funzione deve ritornare in D0 il valore 1 se ha trovato un fold, 0
  999. altrimenti. Nel primo caso la funzione deve anche fornire, tramite A1 e A2
  1000. i numeri di linea iniziali e finali del fold e, tramite A3, la stringa
  1001. rappresentante il fold. è necessario,infine, salvare tutti i registri
  1002. all'ingresso della funzione e ripristinarli all'uscita.
  1003.  
  1004.     NOTA: la funzione 'FOLD ALL' viene eseguita eseguendo una chiamata
  1005. alla funzione su tutte le linee (dalla prima all'ultima) e con il
  1006. numero di colonna pari a 0 (prima colonna).
  1007.  
  1008.  
  1009.  
  1010. ----------------
  1011.  4. Clienti API
  1012. ----------------
  1013.  
  1014.     ProgED consente ad applicazioni esterne (chiamate "clienti") di
  1015.  "agganciarsi" ad esso. Un cliente API è semplicemente un normale
  1016. programma (scritto in qualsiasi linguaggio). Tale programma deve
  1017. essere scritto in modo tale da "registrarsi" presso il ProgED. Ciò
  1018. consente al ProgED di tracciare tutti i clienti e di mandar loro
  1019. messaggi sulle operazioni che devono effettuare.
  1020.  
  1021. I messaggi che un cliente deve inviare a ProgED (nella sua porta
  1022. API di nome "PED_API") hannno la seguente struttura:
  1023.  
  1024.  
  1025.  
  1026.     struct APIMessage
  1027.     {
  1028.         struct Message     am_Message;
  1029.         ULONG              am_MsgType,
  1030.                            am_MsgArg[10],
  1031.                            am_RC;
  1032.     }
  1033.  
  1034.     am_Message:
  1035.  
  1036.          è un campo contenente un messaggio standard Exec.
  1037.  
  1038.     am_MsgType:
  1039.  
  1040.          Contiene il tipo di messaggio da inviare.
  1041.  
  1042.     am_MsgArg[]:
  1043.  
  1044.          è un vettore contenente un massimo di 10 argomenti
  1045.          dipendenti dal tipo del messaggio
  1046.  
  1047.     am_RC:
  1048.  
  1049.          è il codice di ritorno che ProgED restituisce al cliente
  1050.          per informarlo sul successo dell'operazione.
  1051.  
  1052.  
  1053.  
  1054.  
  1055.     I tipi di messaggi che un cliente può spedire a ProgED sono, per ora:
  1056.  
  1057.     PED_API_REGISTER:
  1058.  
  1059.           Registra un cliente presso ProgED. Richiede un puntatore ad una
  1060.           struttura di tipo APIClient in am_MsgArg[0]. Non ritorna nessun
  1061.           risultato in am_RC.
  1062.  
  1063.     PED_API_UNREGISTER:
  1064.  
  1065.           Informa ProgED che il cliente vuole andarsene (!?). Richiede lo
  1066.           STESSO puntatore dato al momento della registrazione, con il
  1067.           messaggio PED_API_REGISTER, in am_MsgArg[0]. Non ritorna nessun
  1068.           risultato in am_RC.
  1069.  
  1070.     PED_API_ADD_INTERNAL_COMMAND:
  1071.  
  1072.           Consente di espandere le funzionalità del ProgED aggiungendo un
  1073.           nuovo comando interno. A tale scopo è necessario allocare e
  1074.           riempire una struttura ArexxExtCmds e fornire il suo puntatore
  1075.           in am_MsgArg[0]. Nessun risultato in am_RC.
  1076.  
  1077.     PED_API_REM_INTERNAL_COMMAND:
  1078.  
  1079.           Rimuove un comando precedentemente aggiunto tramite il messaggio
  1080.           PED_API_ADD_INTERNAL_COMMAND. è necessario fornire in am_MsgArg[0]
  1081.           lo STESSO puntatore dato al momento dell'aggiunta del comando.
  1082.           Non ritorna risultati in am_RC.
  1083.  
  1084.     PED_API_GET_ACTIVE_WINDOW:
  1085.  
  1086.         Ottiene, in am_RC, l'indirizzo della struttura PEDWindow associata
  1087.         alla finestra attualmente attiva.
  1088.  
  1089.     PED_API_GET_WINDOW_LIST:
  1090.  
  1091.         Ottiene, in am_RC, l'indirizzo iniziale della lista di strutture
  1092.         PEDWindow corrispondenti ai testi in memoria.
  1093.  
  1094.     PED_GET_SCREEN_ADDRESS:
  1095.  
  1096.         Ottiene, in am_RC, l'indirizzo dello schermo del ProgED. Se il ProgED
  1097.         è attualmente iconificato ritorna NULL.
  1098.  
  1099.     PED_GET_PREFS_ADDRESS:
  1100.  
  1101.         Ottiene, in am_RC, l'indirizzo della struttura Prefs.
  1102.  
  1103.     PED_GET_PUBSCRNAME:
  1104.  
  1105.         Ottiene, in am_RC, un puntatore al nome dello schermo pubblico
  1106.         aperto dal ProgED.
  1107.  
  1108.     NOTA: La struttura ArexxExtCmds (e tutti gli oggetti a cui puntano i
  1109.           suoi campi), fornita al momento dell'aggiunta del comando, deve
  1110.           rimanere valida in memoria. è possibile riutilizzarla (o
  1111.           liberare la memoria associata solo DOPO aver utilizzato un
  1112.           messaggio di tipo PED_REM_INTERNAL_COMMAND.
  1113.           Lo stesso vale per la struttura APIClient utilizzata per il
  1114.           messaggio PED_API_ADD_INTERNAL_COMMAND. In questo caso è
  1115.           possibile riutilizzare la struttura dopo il corrispondente
  1116.           messaggio PED_API_REM_INTERNAL_COMMAND.
  1117.  
  1118.  
  1119.  
  1120.  
  1121.     I messaggi che ProgED può inviare ad un cliente sono, per ora:
  1122.  
  1123.     PED_API_SHOW:
  1124.  
  1125.         ProgED ha riaperto il suo schermo. L'indirizzo dello schermo
  1126.         può essere ottenuto nel campo am_MsgArg[0]. Nel campo am_MsgArg[1],
  1127.         invece, si trova un puntatore al nome dello schermo pubblico
  1128.         utilizzato. Il cliente puo' utilizzare queste due informazioni
  1129.         per aprire eventuali finestre sullo schermo del ProgED. Questo
  1130.         messaggio viene spedito solo se, al momento della registrazione,
  1131.         il cliente ha settato il flag NOTIFY_ON_SHOWHIDE.
  1132.  
  1133.     PED_API_HIDE:
  1134.  
  1135.         ProgED stà per chiudere il suo schermo. Questo messaggio viene
  1136.         spedito solo se, al momento della registrazione, il cliente ha
  1137.         settato il flag NOTIFY_ON_SHOWHIDE.
  1138.  
  1139.  
  1140.     PED_API_KEY:
  1141.  
  1142.         L'utente ha battuto un tasto. Il cliente può ottenere la struttura
  1143.         IntuiMessage relativa leggendo il campo MsgArg[0]. Tale campo
  1144.         conterrà il puntatore alla struttura IntuiMessage contenente il
  1145.         messaggio di tipo rawkey ricevuto dal ProgED. Questo messaggio
  1146.         viene spedito solo se, al momento della registrazione, il cliente
  1147.         ha settato il flag NOTIFY_ON_KEY. 
  1148.         NOTA: In ogni caso, al termine della gestione di questo messaggio,
  1149.         ProgED eseguirà l'azione legata al tasto. Inoltre il cliente
  1150.         NON DEVE modificare il messaggio stesso, perchè è un messaggio
  1151.         proveniente da Intuition!
  1152.  
  1153.     PED_API_QUIT:
  1154.  
  1155.         ProgED sta per terminare. Alla ricezione di questo messaggio (che
  1156.         viene SEMPRE inviato a prescindere dai flag NOTIFY_xxx) il cliente
  1157.         deve chiudere le eventuali finestre e terminare. E' VIETATO
  1158.         UTILIZZARE LA PORTA API DOPO LA RICEZIONE DI QUESTO MESSAGGIO !!!!!
  1159.         Questo implica che, dopo la ricezione di questo messaggio, il
  1160.         cliente NON DEVE tentare di togliere la registrazione e/o la
  1161.         definizione di comandi esterni.
  1162.  
  1163.  
  1164.  
  1165.     Qui di seguito sono riportate le spiegazioni riguardanti i campi delle
  1166. diverse strutture utilizzate.
  1167.  
  1168.  
  1169.     struct APIClient
  1170.     {
  1171.         struct MsgPort          *ac_ClientPort;
  1172.         ULONG                    ac_Notify;
  1173.         char                    *ac_name;
  1174.         struct APIClient        *ac_Next;
  1175.     }
  1176.  
  1177.     ac_ClientPort:
  1178.  
  1179.         Indica l'indirizzo di una porta messaggi a cui ProgED invierà i
  1180.         messaggi informativi al cliente. Questo tipo di messaggi verrà
  1181.         spiegato successivamente.
  1182.  
  1183.     ac_Notify:
  1184.  
  1185.         Indica quali tipi di messaggi il cliente vuole ricevere dal ProgED.
  1186.         Gli unici tipi di messaggi selezionabili attualmente sono indicati
  1187.         dal flag NOTIFY_ON_SHOW_HIDE. 
  1188.  
  1189.     ac_Name:
  1190.  
  1191.         Punta al nome del cliente.
  1192.  
  1193.     ac_Next:
  1194.  
  1195.         Porre a NULL. Conterrà il successore cliente della lista interna
  1196.         del ProgED.
  1197.  
  1198.  
  1199.  
  1200.  
  1201.     struct ArexxExtCmds
  1202.     {
  1203.         UBYTE                    External;
  1204.         char                    *Name;
  1205.         char                    *Template;
  1206.         void                    *Defaults[MAXREXXARGS];
  1207.         LONG ASM                (*CommFunc)( RG(a0) struct CommandData *);
  1208.         struct ArexxExtCmds     *NextCmd;
  1209.     }
  1210.  
  1211.     External:
  1212.  
  1213.         Indica che il comando è gestito da un cliente. Porre SEMPRE a TRUE.
  1214.  
  1215.     Name:
  1216.  
  1217.         Nome del comando. Specificare sempre in lettere maiuscole.
  1218.  
  1219.     Template:
  1220.  
  1221.         è il template AmigaDOS del comando.
  1222.  
  1223.     Default[]:
  1224.  
  1225.         Indica il vettore di puntatori che deve essere passato alla
  1226.         funzione ReadArgs della dos.library. Deve contenere i valori
  1227.         di default dei parametri del template. Per ulteriori informazioni
  1228.         leggere la documentazione della funzione ReadArgs.
  1229.  
  1230.     CommFunc:
  1231.  
  1232.         Indica il puntatore alla funzione che realizza il comando. Tale
  1233.         funzione deve essere scritta in assembler (o ricevere i parametri
  1234.         come una funzione assembler). Essa deve ricevere un puntatore ad
  1235.         una struttura CommandData in A0 e ritornare il codice d'errore
  1236.         risultante dall'esecuzione in D0. In seguito analizzeremo la
  1237.         struttura CommandData.
  1238.  
  1239.     NextCmd:
  1240.  
  1241.         Porre a NULL. ProgED ne modificherà il valore portandolo a
  1242.         puntare al prossimo comando fornito dallo stesso cliente o da
  1243.         un altro.
  1244.  
  1245.  
  1246.  
  1247.  
  1248.     struct CommandData
  1249.     {
  1250.         char              *CommandLine;
  1251.         void             **CommandArgs;
  1252.         struct MyWindow   *CurrentWindow,
  1253.                           *FirstWindow;
  1254.         struct Prefs      *CurrentPrefs;
  1255.         LONG ASM (*ExecuteInternalCommand)(RG(a0) char *);
  1256.     }
  1257.  
  1258.     CommandLine:
  1259.  
  1260.         Punta ad una stringa riportante l'intera linea di comando riguardante
  1261.         il comando.
  1262.  
  1263.     CommandArgs:
  1264.  
  1265.         Punta ad un vettore di (void *). Ogni puntatore deve essere utilizzato
  1266.         secondo le norme dettate dalla ReadArgs. Questo vettore, infatti, è
  1267.         il risultato della applicazione della stessa funzione alla linea di
  1268.         comando (tenendo presente i default dati nella struttura ArexxExtCmds).
  1269.  
  1270.     CurrentWindow:
  1271.  
  1272.         Indica il puntatore alla struttura PEDWindow indicante la finestra
  1273.         attualmente attiva.
  1274.  
  1275.     FirstWindow:
  1276.  
  1277.         Indica il puntatore alla prima struttura PEDWindow della lista di
  1278.         finestre mantenuta dal ProgED.
  1279.  
  1280.     ExecuteInternalCommand:
  1281.  
  1282.         è un puntatore ad una funzione assembler. Chiamando questa
  1283.         funzione (specificando in A0 il puntatore ad una stringa) è
  1284.         possibile eseguire i comandi interni del ProgED. A tale scopo
  1285.         la stringa puntata da A0 deve contenere la linea di comando
  1286.         desiderata. In D0 viene ritornato il codice d'errore risultante.
  1287.  
  1288.         NOTA: Non utilizzare la porta ARexx di ProgED per eseguire i
  1289.         comandi interni! Così facendo, infatti, si bloccherebbero
  1290.         sia ProgED che il cliente. Ciò è dovuto al fatto che, mentre
  1291.         ProgED esegue la funzione che implementa il comando, NON PUò
  1292.         rispondere ai messaggi provenienti da sè stesso!
  1293.  
  1294.  
  1295.  
  1296. -------------------
  1297.  5. Funzioni utili
  1298. -------------------
  1299.  
  1300.     Le funzioni C che seguono sono utili per la scrittura di folder e
  1301. scanner. Esse riguardano la ricerca di linee. Potete utilizzarle
  1302. tagliandole da questo testo e inserendole nei vostri programmi.
  1303.  
  1304.  
  1305.  
  1306. /*****
  1307.  *
  1308.  * FUNZIONE:    struct Line *SearchLine(struct Line *line,int y)
  1309.  *
  1310.  * SCOPO:    Cerca l'indirizzo della linea "y-esima" (0=prima) a partire
  1311.  *        dalla prima linea del file data da line.
  1312.  *        NB: Tiene conto dei FOLDS.
  1313.  *
  1314.  * RESTITUISCE: Un puntatore alla linea cercata.
  1315.  *
  1316.  ****/
  1317.  
  1318. struct Line *SearchLine(struct Line *line,int y)
  1319. {
  1320.     while(((y--)>0)&&(line))    line=NextLine(line);
  1321.     return(line);
  1322. }
  1323.  
  1324.  
  1325.  
  1326. /*****
  1327.  *
  1328.  * FUNZIONE:    int SearchLine2(struct Line *line,int y)
  1329.  *
  1330.  * SCOPO:    Cerca il # della linea (tenendo conto dei FOLD)
  1331.  *        della linea ASSOLUTA y.
  1332.  *
  1333.  * RESTITUISCE: Il # della linea cercata.
  1334.  *
  1335.  ****/
  1336.  
  1337. int SearchLine2(struct Line *line,int y)
  1338. {
  1339.     int    n=0;
  1340.  
  1341.     while(((y--)>0)&&(line))
  1342.     {
  1343.         if (!line->Folder)    n++;
  1344.         else    if (line->NextLine)
  1345.                 if (!line->NextLine->Folder)    n++;
  1346.         line=line->NextLine;
  1347.     }
  1348.     if (line)    return(n);
  1349.     else        return(0);
  1350. }
  1351.  
  1352.  
  1353.  
  1354. /*****
  1355.  *
  1356.  * FUNZIONE:    int SearchLine3(struct Line *first,struct Line *line)
  1357.  *
  1358.  * SCOPO:    Cerca il # assoluto della linea line a partire
  1359.  *        dalla prima linea del file data da first.
  1360.  *        NB: NON tiene conto dei FOLDS.
  1361.  *
  1362.  * RESTITUISCE: Il # della linea cercata.
  1363.  *
  1364.  ****/
  1365.  
  1366. int SearchLine3(struct Line *first,struct Line *line)
  1367. {
  1368.     long    n=0;
  1369.  
  1370.     while(first)
  1371.     {
  1372.         if (first==line)    break;
  1373.         n++;
  1374.         first=first->NextLine;
  1375.     }
  1376.     return(n);
  1377. }
  1378.  
  1379.  
  1380.  
  1381. /*****
  1382.  *
  1383.  * FUNZIONE:    struct Line *SearchLine4(struct Line *line,int y)
  1384.  *
  1385.  * SCOPO:    Cerca l'indirizzo della linea "y-esima" (0=prima) a partire
  1386.  *        dalla prima linea del file data da line.
  1387.  *        NB: NON tiene conto dei FOLDS.
  1388.  *
  1389.  * RESTITUISCE: Un puntatore alla linea cercata.
  1390.  *
  1391.  ****/
  1392.  
  1393. struct Line *SearchLine4(struct Line *line,int y)
  1394. {
  1395.     while(((y--)>0)&&(line))    line=line->NextLine;
  1396.     return(line);
  1397. }
  1398.  
  1399.  
  1400.  
  1401.